home *** CD-ROM | disk | FTP | other *** search
- #include "win.h"
-
- map(w)
- struct window *w;
- {
- char work[MAXSIZE];
- struct window *p;
- int sx, sy, sx2, sy2, upper;;
- extern struct list head;
- extern void save(), memcpy(), show();
-
- w->x2 = w->x + w->w - 1;
- w->y2 = w->y + w->h - 1;
- if (w->mapped)
- return (-1);
- if (w->save != NULL){
- save(work, w->x, w->y, w->x2, w->y2);
- memcpy(w->save, work, w->size);
- }
- w->mapped = TRUE;
- if (w->save != NULL)
- show(work, w);
-
- upper = FALSE;
- for (p = head.next; p->next != NULL; p = p->next){
- if (p == w){
- upper = TRUE;
- continue;
- }
- if (!p->mapped)
- continue;
- sx = max(p->x, w->x);
- sy = max(p->y, w->y);
- sx2 = min(p->x2, w->x2);
- sy2 = min(p->y2, w->y2);
- if (sx <= sx2 && sy <= sy2){ /* intersection ? */
- if (upper){
- if (w->notify != (void (*)())0
- && (w->notifyMask & HIDE_NOTIFY))
- (*w->notify)(p, HIDE_NOTIFY); /* hide by p */
- } else {
- if (p->notify != (void (*)())0
- && (p->notifyMask & HIDE_NOTIFY))
- (*p->notify)(w, HIDE_NOTIFY); /* hide p */
- }
- }
- }
- return (0);
- }
-
- unmap(w)
- struct window *w;
- {
- char work[MAXSIZE];
- struct window *p;
- int sx, sy, sx2, sy2;
- extern struct list head;
- extern void expose();
-
- if (!w->mapped)
- return (-1);
- if (w->save != NULL)
- expose(work, w, w->x, w->y, w->x2, w->y2);
- w->mapped = FALSE;
- for (p = head.next; p != w; p = p->next){
- if (!p->mapped)
- continue;
- sx = max(p->x, w->x);
- sy = max(p->y, w->y);
- sx2 = min(p->x2, w->x2);
- sy2 = min(p->y2, w->y2);
- if (sx <= sx2 && sy <= sy2){
- if (p->notify != (void (*)())0
- && (p->notifyMask & EXPOSE_NOTIFY))
- (*p->notify)(w, EXPOSE_NOTIFY);
- }
- }
- return (0);
- }
-
- update(w)
- struct window *w;
- {
- char work[MAXSIZE];
- struct window *p;
- int x, y, x2, y2, sx, sy, sx2, sy2;
- extern void memcpy(), show(), expose();
-
- if (!w->mapped)
- return (0);
-
- if (w->save == NULL){
- x = w->x; y = w->y; x2 = w->x2, y2 = w->y2;
- for (p = w->next; p !=NULL; p=p->next){
- if (!p->mapped || p->save == NULL)
- continue;
- sx = max(x, p->x);
- sy = max(y, p->y);
- sx2 = min(x2, p->x2);
- sy2 = min(y2, p->y2);
- if (sx <= sx2 && sy <= sy2)
- expose(work, p, sx, sy, sx2, sy2);
- }
- } else {
- memcpy(work, w->save, w->size);
- show(work, w);
- }
- return (0);
- }
-